【Ruby】 selectメソッド完全マニュアル | 基礎から応用・filterとの違いについても解説

最終更新日:

この記事では、

    • selectメソッドの基本的な使い方
    • selectメソッドとそれに類似したメソッドの比較
    • 複雑な条件下でも使えるselectメソッドの応用例

    について解説していきたいと思います。

    Rubyのselectメソッドとその仕組み

    Rubyにおけるselectメソッドは、配列ハッシュから特定の条件に合致する要素だけを抽出するのに使われます。

    これはEnumerableモジュールにより提供され、多くのコレクションオブジェクトで利用可能です。

    基本的な使用方法は以下の通りです。

    numbers = [1, 2, 3, 4, 5]
    evennumbers = numbers.select { |number| number.even? }
    puts evennumbers
    # 出力結果: [2, 4]

    この例では、配列numbersから偶数のみを選んで新しい配列even_numbersを作成しています。selectメソッドにブロックが渡され、そのブロック内で要素が偶数かどうかを評価しています。

    配列とハッシュでのselectメソッドの使い分け

    配列だけでなく、ハッシュに対してもselectメソッドを利用できます。ハッシュでの使用例を見てみましょう。

    students = {Alice: 90, Bob: 80, Carol: 85}
    highscores = students.select { |name, score| score > 85 }
    puts highscores
    # 出力結果: {:Alice=>90}

    この例では、スコアが85点より高い生徒のみを抽出しています。配列と異なり、ハッシュでのselectメソッドではキーと値のペアがブロックに渡されます。

    selectメソッドは、集合の中から条件にマッチするものだけを選択する際に非常に便利です。配列やハッシュに含まれる要素数が多い場合や、複雑な条件での選択が必要な場合においても、このメソッドは力を発揮します。

    関連:【Ruby】 hashの使い方完全マニュアル | 追加, 更新, 削除, 高度な利用方法について現役エンジニアが解説します

    【Ruby】 hashの使い方完全マニュアル | 追加, 更新, 削除, 高度な利用方法について現役エンジニアが解説します

    基本的なselectの使い方とサンプルコード

    Rubyでselectメソッドを使うときの基本的な形式は非常にシンプルです。配列やハッシュから、特定の条件に合う要素のみを選び出すことができます。次の例では、配列から偶数のみを抽出しています。

    numbers = [1, 2, 3, 4, 5]
    evennumbers = numbers.select { |number| number.even? }
    puts evennumbers.inspect
    # 出力結果: [2, 4]

    このコードでは、箇条書きされた数字の配列から、even?メソッドを使って偶数のみを選んでいます。selectメソッドはブロックの評価がtrueになる要素を集め、新しい配列を返します。

    便利なselect!メソッド:破壊的変更を伴う使い方

    Rubyではselect!メソッドも用意されており、これは元の配列を破壊的に変更します。条件に合わない要素を元の配列から削除します。

    numbers = [1, 2, 3, 4, 5]
    numbers.select! { |number| number.even? }
    puts numbers.inspect
    # 出力結果: [2, 4]

    このコードでは、select!メソッドを使って元の配列numbers自体を更新しています。偶数以外の要素が配列から削除されます。

    インデックスを配慮したselectの利用法:select.with_index

    selectメソッドは、配列の要素だけでなく、そのインデックスに基づいて選択することもできます。例えば、以下のようにインデックスが偶数である要素だけを選ぶことが可能です。

    items = ['apple', 'banana', 'grape', 'orange']
    evenindexitems = items.select.with_index { |item, index| index.even? }
    puts evenindex_items.inspect
    # 出力結果: ["apple", "grape"]

    このサンプルでは、select.with_indexメソッドを使って、インデックスが偶数の要素だけを抽出しています。

    正規表現を用いたselectの効果的な活用

    正規表現とselectメソッドを組み合わせることで、文字列を含む配列から特定のパターンに合致する要素のみを選び出すことができます。

    words = ['ruby', 'rails', 'code', 'programming', 'computer']
    rwords = words.select { |word| word.match?(/^r/) }
    puts rwords.inspect
    # 出力結果: ["ruby", "rails"]

    このコードでは、単語の先頭が’r’で始まる要素のみを選択しています。match?メソッドと正規表現/^r/を使って、条件に合う要素を抽出しています。

    関連:【Ruby】正規表現完全マニュアル | 置換, 抽出, メタ文字の利用などを解説

     

    複数条件でのselectメソッドの使用例

    selectメソッドを使って、複数の条件を組み合わせて要素を選択することもできます。例えば、数字が5より大きく10より小さい要素だけを選び出すことは以下のように実現できます。

    numbers = [1, 6, 3, 8, 10, 12, 7]
    filterednumbers = numbers.select { |number| number > 5 && number < 10 }
    puts filterednumbers.inspect
    # 出力結果: [6, 8, 7]

    このコードでは、&&演算子を使って数字が5より大きく10より小さい、という複数の条件に基づいて要素を選択しています。このようにselectメソッドは非常に柔軟に利用でき、Rubyにおけるデータ処理において強力なツールとなります。

    selectと似た挙動をするrejectメソッド

    selectメソッドが条件に合致する要素を選択するのに対し、rejectメソッドはその反対で、条件に合致しない要素を選択します。使い方はselectメソッドと非常に似ています。

    numbers = [1, 2, 3, 4, 5]
    oddnumbers = numbers.reject { |number| number.even? }
    puts oddnumbers.inspect
    # 出力結果: [1, 3, 5]

    この例では、偶数ではない数、つまり奇数のみを抽出しています。rejectメソッドは条件にマッチしない要素を新しい配列として返すので、条件を逆にしたい場合に便利です。

    関連:【Ruby】rejectメソッドの使い方 | reject!やdelete_ifとの違いについても解説

    【Ruby】rejectメソッドの使い方 | reject!やdelete_ifとの違いについても解説

    初めの要素の選択:find(detect)メソッド

    find(エイリアスdetect)メソッドは、配列やハッシュから条件に合致する最初の要素を返します。条件にマッチする要素が見つからない場合は、nilを返します。

    numbers = [1, 2, 3, 4, 5]
    firstevennumber = numbers.find { |number| number.even? }
    puts firstevennumber
    # 出力結果: 2

    このコードでは、配列numbersの中の最初の偶数を探しています。findメソッドは、最初に条件を満たした要素を見つけた時点で検索をやめ、その要素を返します。

    selectとmapメソッドの異なる用途

    selectメソッドと似たように聞こえるmap(エイリアスcollect)メソッドは、実際には全く異なる目的で使われます。

    mapメソッドはコレクションの各要素に対してブロックを実行し、その結果を新しい配列にまとめて返します。

    numbers = [1, 2, 3, 4, 5]
    squarednumbers = numbers.map { |number| number ** 2 }
    puts squarednumbers.inspect
    出力結果: [1, 4, 9, 16, 25]

    この例では、配列numbersの各要素を二乗し、その結果を新しい配列squared_numbersに格納しています。これは、単に条件に基づいて選び出すselectとは違い、要素に何らかの処理を加えたい場合に便利です。

    関連:Ruby mapメソッドの完全マニュアル | eachとの違いや発展的な使い方について現役エンジニアが解説

    【Ruby】mapメソッドの使い方は?eachとの違いや発展的な使い方について現役エンジニアが解説

    よくある質問

    rubyでselectとfilterはどう使い分ける?違いは?

    Rubyではselectメソッドは条件に一致する要素を配列やハッシュから選択するのに使います。Ruby 2.6以降、filterメソッドがselectメソッドのエイリアスとして追加されました。つまり、selectfilterは同じ動作をします。

    > instance method Array#filter
    以下のコードで示されているようにどちらのメソッドも配列内の偶数を選択するのに使えます。

    numbers = [1, 2, 3, 4, 5]
    evennumberswithselect = numbers.select { |number| number.even? }
    evennumberswithfilter = numbers.filter { |number| number.even? }
    
    puts evennumberswithselect.inspect # => [2, 4]
    puts evennumberswithfilter.inspect # => [2, 4]

    このことから、selectfilterの間には機能的な違いはありません。利用する際は好みやコードの一貫性に基づいて選択してください。

    selectをhashで使う場合どう使ったらいい?

    ハッシュに対してselectメソッドを使用する場合、キーと値のペアを評価するブロックを提供します。条件に一致するキーと値のペアだけが新しいハッシュとして返されます。

    例えば、値が特定の基準以上のペアを選択したい場合は次のようにします。

    scores = { alice: 10, bob: 20, carol: 30 }
    highscores = scores.select { |key, value| value > 15 }
    puts high_scores.inspect
    # 出力結果: {:bob=>20, :carol=>30}
    

    この例では、selectメソッドがスコアが15を超える要素(ペア)のみ抽出して、その結果を新しいハッシュとして返しています。ハッシュでselectメソッドを使う場合、ブロックに渡されるのは|key, value|の形でキーと値のペアです。